<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // // 1.使用eval 去执行这个字符串

        // var exports = {};
        // // 模拟exports对象
        // // eval   new function
        // // 把导出变成字符串
        // // 'exports.default = function (a, b) { return a + b }';

        // // 使用eval 去执行这个字符串
        // eval('var a = 123;exports.default = function (a, b) { return a + b }');

        // console.log(exports.default(2, 4));
        // console.log('a', a);

        // // `var add = require('./add').default; console.log(add(1, 2));`
    </script>

    <script>
        // 2.1.直接使用eval 会造成 全局变量污染
        // 2.2.解决办法：使用闭包 (自执行函数)
        // var exports = {};
        // // 模拟exports对象
        // // eval  new function
        // // 把导出变成字符串
        // // 'exports.default = function (a, b) { return a + b }';
        // // 使用eval 去执行这个字符串
        // (function (exports, code) {
        //     eval(code)
        // })(exports, 'var a = 123;exports.default = function (a, b) { return a + b }')
        // console.log(exports.default(2, 4));
        // console.log('a', a); // a is not defined
        // // `var add = require('./add').default; console.log(add(1, 2));`
    </script>

    <script>
        // // 3.1.仿制require
        // function require(file) {
        //     var exports = {};
        //     (function (exports, code) {
        //         eval(code)
        //     })(exports, 'var a = 123;exports.default = function (a, b){return a+b }')
        //     return exports
        // }
        // var add = require('add.js').default;
        // console.log(add(2, 3));
    </script>
    <script>
        // 4.1.
        // function require(file) {
        //     var exports = {};
        //     (function (exports, code) {
        //         eval(code)
        //     })(exports, 'var a = 123;exports.default = function (a, b){return a+b }')
        //     return exports
        // }

        // var add = require('add.js').default;
        // console.log(add(2, 3));


        // (function (list) {
        //     function require(file) {
        //         var exports = {};
        //         (function (exports, code) {
        //             eval(code)
        //         })(exports, list[file]);
        //         return exports
        //     }
        //     require('index.js')
        // })({
        //     'index.js': `var add = require("add.js").default`,
        //     "add.js": "var a = 123;exports.default = function (a, b){return a + b}"
        // });

        // --------------

        var exports = {};
        (function (exports, code) {
            eval(code)
        })(exports, "var a = 123;exports.default = function (a, b){return a + b}")
        console.log(exports.default(1, 2));



        // ------------
    </script>
</body>

</html>